home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Games / Arashi 1.1.1 / source code / Game Source / jam src / STLevelSelect.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-01-13  |  8.5 KB  |  381 lines  |  [TEXT/KAHL]

  1. /*/
  2.      Project Arashi: STLevelSelect.c
  3.      Major release: Version 1.1d2, 9/5/95
  4.  
  5.      Last modification: Thursday, January 13, 1994, 8:26
  6.      Created: Wednesday, March 6, 1991, 12:00
  7.  
  8.      Copyright © 1991-1994, Juri Munkki
  9. /*/
  10.  
  11. #include "VA.h"
  12. #include "STORM.h"
  13. #include "GamePause.h"
  14. #include <math.h>
  15. #include "PlayOptions.h"
  16. #include "heroflags.h"
  17.  
  18. #define    MAXSELECTABLES    96
  19. /* #define DEBUGGING_ROUTINES */
  20.  
  21. extern    EventRecord    Event;
  22. extern     Player    Hero;
  23.  
  24. static    Point        BoxSize;
  25.  
  26. int        FirstLevel=0;
  27. int        LastLevel=300;
  28. int        LastSelect=200;
  29.  
  30. void    DrawLevelPresentation(offset,resnum)
  31. int        offset,resnum;
  32. {
  33.                 shape    **spacehand;
  34.     register    shape    *space;
  35.     register    long    x,y;
  36.                 long    xmin,xmax;
  37.                 long    ymin,ymax;
  38.     register    int        i,angle;
  39.     register    int        *angles;
  40.                 Point    base;
  41.  
  42.  
  43.     spacehand=(void *)GetResource('SPCE',resnum);
  44.     HLock(spacehand);
  45.     space=*spacehand;
  46.     
  47.     x=0;        y=0;
  48.     xmin=0;        ymin=0;
  49.     xmax=0;        ymax=0;
  50.  
  51.     angle=0;
  52.     angles=space->ang;
  53.     for(i=0;i<space->numsegs;i++)
  54.     {    angle+= *angles++;
  55.         while(angle<0)             angle += ANGLES;
  56.         while(angle>=ANGLES)    angle -= ANGLES;
  57.         
  58.         x += Cosins[angle];        y -= Sins[angle];
  59.         if(x>xmax) xmax=x;        if(y>ymax) ymax=y;
  60.         if(x<xmin) xmin=x;        if(y<ymin) ymin=y;
  61.     }
  62.     xmax += 512;    ymax+= 512;
  63.     xmin -= 512;    ymin-= 512;
  64.     
  65.     x = -(xmin+xmax)/2;
  66.     y = -(ymin+ymax)/2;
  67.     
  68.     xmax -= xmin;
  69.     ymax -= ymin;
  70.     
  71.     if(xmax<ymax)    xmax=ymax;
  72.     
  73.     base.h = BoxSize.h/2 + offset;
  74.     base.v = VA.frame.bottom - BoxSize.v;
  75.     
  76.     VAMoveTo( x * BoxSize.h / xmax + base.h , y * BoxSize.v / xmax + base.v);
  77.     angle=0;
  78.     angles=space->ang;
  79.     for(i=0;i<space->numsegs;i++)
  80.     {    angle+= *angles++;
  81.         while(angle<0)             angle += ANGLES;
  82.         while(angle>=ANGLES)    angle -= ANGLES;
  83.         x += Cosins[angle];        y -= Sins[angle];
  84.         VASafeLineTo( x * BoxSize.h / xmax + base.h , y * BoxSize.v / xmax + base.v);
  85.     }
  86.     
  87.     HUnlock(spacehand);
  88.     ReleaseResource(spacehand);
  89. }
  90.  
  91. typedef    struct
  92. {    
  93.     int            levelresource;
  94.     ColorSpec    levelcolor;
  95.     int            levelnumber;
  96.     long        levelbonus;                /* added field (mz) */
  97. }    selectable;
  98.  
  99.  
  100. int        CreateStable(stable,highestLastLevel)
  101. selectable    *stable;
  102. int    highestLastLevel;
  103. {
  104.                 short        selectFlag;
  105.     register    int            levcount;
  106.     register    int            colorId;
  107.     register    ColorSpec    **LCTable;
  108.                 int            SAVEDGAMECOLOR=7;
  109.                 int            highlvl=highestLastLevel;
  110.                 
  111.     if (highestLastLevel<9)
  112.         highlvl=9;
  113.     
  114. #ifdef DEBUGGING_ROUTINES
  115.     highlvl = 99;
  116. #endif
  117.  
  118.     LoadGameF();
  119.  
  120.     LCTable = (void *)GetResource('CLOT',SAVEDGAMECOLOR);
  121.  
  122.     stable->levelbonus = Hero.score;
  123.     stable->levelresource = ThisLevel.lvField;
  124.     stable->levelnumber = ThisLevel.lvNumber;
  125.     stable->levelcolor = (*LCTable)[8]; 
  126.  
  127.     ReleaseResource(LCTable);
  128.     
  129.     ThisLevel.lvNext = 1;
  130.     levcount = 1;
  131.  
  132.     do
  133.     {    
  134.         while(0 == (selectFlag = STLoadForSelect(PlayOptions->restart)));
  135.     
  136.         if(selectFlag == 1)
  137.         {    colorId = ThisLevel.lvColor;
  138.             if (colorId == 5)                /* if invis field color use grey shade     */
  139.                 colorId += 128;    /* for invisi levels (mz)     */
  140.  
  141.             LCTable = (void *)GetResource('CLOT',colorId);
  142.  
  143.             stable[levcount].levelresource = ThisLevel.lvField;
  144.             stable[levcount].levelnumber = ThisLevel.lvNumber;
  145.             stable[levcount].levelcolor = (*LCTable)[8];
  146.             stable[levcount].levelbonus = ThisLevel.lvStBonus;     /* starting bonus (mz)     */                
  147.             
  148.             ReleaseResource(LCTable);
  149.  
  150.             levcount++;
  151.         }
  152.         
  153.     }    while(levcount < MAXSELECTABLES && selectFlag >= 0 &&
  154.             (ThisLevel.lvNumber <= highlvl || PlayOptions->restart));
  155.     
  156.     if(PlayOptions->restart == 0)    /* Arcade mode */
  157.         if(highlvl < stable[levcount-1].levelnumber)
  158.             levcount--;
  159.     
  160.     return    (levcount);
  161. }
  162. /* ================================= */
  163.  
  164.  
  165. int        DoLevelSelect(highestLastLevel)
  166. int highestLastLevel;
  167. {
  168.                 selectable    *stable;
  169.     register    int            i,j;
  170.     register    int            x,y;
  171.                 static    int    thelevel=0;
  172.                 int            reallevel;
  173.                 int            theoffset=0;
  174.                 int            done=0;
  175.                 Point        mouse,CenterMouse;
  176.     register    int            direction;
  177.     register    ColorSpec    *colp;
  178.                 Handle        SelColors;
  179.                 int            OldFrameSpeed;
  180.                 int            levelnum;               /* temp holding variable (mz) */
  181.                 Point        infoBoxSize;
  182.                 unsigned char    *infotext=(void *)"\pSaved Game Score";
  183.                 
  184.     stable = (selectable *)NewPtr(sizeof(selectable) * MAXSELECTABLES);
  185.         
  186.     SelColors=GetResource('CLOT',128);
  187.     HandToHand(&SelColors);
  188.     HLock(SelColors);
  189.     colp = (ColorSpec *)*SelColors;
  190.     
  191.     LastLevel=LastSelect=CreateStable(stable,highestLastLevel)-1;
  192.     
  193.     CenterMouse.h=(VA.DisplayFrame.right+VA.DisplayFrame.left)/2;
  194.     CenterMouse.v=(VA.DisplayFrame.bottom+VA.DisplayFrame.top)/2;
  195.  
  196.     mouse=CenterMouse;
  197.     GetSetMouse(&mouse);
  198.  
  199.     VAEraseBuffer();
  200.     VACatchUp();
  201.     
  202.     BoxSize.h=VA.frame.right/5;
  203.     BoxSize.v=BoxSize.h;
  204.     
  205.     infoBoxSize.h=VA.frame.right/10;
  206.     infoBoxSize.v=infoBoxSize.h;
  207.  
  208.     OldFrameSpeed = VA.FrameSpeed;
  209.     VA.FrameSpeed = 6;
  210.  
  211.     do
  212.     {    reallevel=thelevel+(theoffset>BoxSize.h/2 ? 1:0);
  213.         GameEvent();
  214.     
  215.         switch(Event.what)
  216.         {
  217.             case keyDown:
  218.             case autoKey:
  219.                 switch((char)Event.message)
  220.                 {    case 'p':
  221.                     case 'P':
  222.                         GamePause(LevelSelectRunning);
  223.                         break;
  224.                     case 'Q':
  225.                     case 'q':
  226.                     case 27:
  227.                     case 13:
  228.                         done=-1;
  229.                         break;
  230.                     default:
  231.                         PlayA(PhazerIn,0);
  232.                         PlayB(PhazerIn,0);
  233.                         done=stable[reallevel].levelnumber;
  234.                         break;
  235.                 }
  236.                 break;
  237.             case mouseUp:
  238.                 PlayA(PhazerIn,0);
  239.                 PlayB(PhazerIn,0);
  240.                 done=stable[reallevel].levelnumber;
  241.                 break;
  242.             case mouseDown:
  243.                 break;
  244.         }
  245.  
  246.         mouse=CenterMouse;
  247.         GetSetMouse(&mouse);
  248.         
  249.         if(mouse.h)
  250.         {    theoffset-=mouse.h;
  251.             direction=(direction/2)+mouse.h;
  252.             if(direction==0) direction=mouse.h;
  253.         }
  254.         else
  255.         {    if(theoffset!=0)
  256.             {    theoffset-=direction;
  257.                 if(theoffset<0)    theoffset=0;
  258.                 if(theoffset>BoxSize.h) theoffset=BoxSize.h;
  259.             }
  260.         }
  261.         while(theoffset<0)
  262.         {    theoffset+=BoxSize.h;
  263.              thelevel--; 
  264.         }
  265.         if(thelevel<0)
  266.         {    thelevel=0;
  267.             theoffset=0;
  268.         }
  269.  
  270.         while(theoffset>=BoxSize.h)
  271.         {    theoffset-=BoxSize.h;
  272.              thelevel++; 
  273.         }
  274.  
  275.         if(thelevel>=LastSelect)    
  276.         {    thelevel=LastSelect;
  277.             theoffset=0;
  278.         }
  279.  
  280.         for(i=0;i<6;i++)
  281.         {    int        lvnum = thelevel+i-2;
  282.         
  283.             if(lvnum>=0 && lvnum<=LastLevel)
  284.             {    VA.color=i+1;
  285.                 DrawLevelPresentation(i * BoxSize.h-theoffset,stable[lvnum].levelresource);
  286.                 colp[i+1]=stable[lvnum].levelcolor;
  287.             }
  288.         }
  289.  
  290.         VA.segmscale = BoxSize.v>>4;
  291.         if(VA.segmscale<1) VA.segmscale = 1;
  292.         VA.color = BG1;
  293.         /* print level number below box */
  294.         levelnum = thelevel+(theoffset>BoxSize.h/2 ? 1:0);
  295.         VADrawPadNumber(stable[levelnum].levelnumber
  296.                         ,2*BoxSize.h+BoxSize.h/2,VA.frame.bottom-4*VA.segmscale,3);
  297.     
  298.         /* show starting level bonus on top of box */
  299.         VADrawPadNumber(stable[levelnum].levelbonus,2*BoxSize.h+BoxSize.h/2 + 4*VA.segmscale,
  300.                         VA.frame.bottom-(BoxSize.v)*(1.6),7);
  301.         /*VADrawPadNumber(levelnum,2*BoxSize.h+BoxSize.h/2 + 4*VA.segmscale,
  302.                         VA.frame.bottom-(BoxSize.v)*(2),7);*/
  303.         VA.color=0;
  304.         x = BoxSize.h * 2;
  305.         y = VA.frame.bottom - BoxSize.v / 2;
  306.  
  307.         VAMoveTo    (x,                y);
  308.         VASafeLineTo(x+BoxSize.h,    y);
  309.         VASafeLineTo(x+BoxSize.h,    y-BoxSize.h);
  310.         VASafeLineTo(x,                y-BoxSize.h);
  311.         VASafeLineTo(x,                y);
  312.     
  313.     
  314.         y -= BoxSize.v*1.5;
  315.         x = (VA.frame.right-infoBoxSize.h)>>1;
  316.         
  317.         VAMoveTo    (x,                y);        /* */
  318.         VASafeLineTo(x+infoBoxSize.h,    y);
  319.         VASafeLineTo(x+infoBoxSize.h,    y-infoBoxSize.h);
  320.         VASafeLineTo(x,                y-infoBoxSize.h);
  321.         VASafeLineTo(x,                y);        /* */
  322.         if(levelnum > 0)
  323.             infotext=(void *)"\p Starting Bonus ";
  324.         else
  325.             infotext=(void *)"\pSaved Game Score";
  326.             
  327.         VA.segmscale= VA.segmscale>>2;
  328.         if(VA.segmscale<=1) VA.segmscale=2;
  329.         VA.color=BG1;
  330.         x = ((VA.frame.right - ((VA.segmscale*3+3)<<4) ))>>1;
  331.             
  332.         VAMoveTo(x, y - infoBoxSize.h - 3 ); 
  333.         VADrawText((char *)infotext,1,16);
  334.             
  335.         x = ( (VA.frame.right - (VA.segmscale*3+3)*12 )>>1 );
  336.         VAMoveTo(x, y + VA.segmscale*7 + 2 ); 
  337.         infotext=(void *)"\pLevel number";
  338.         VADrawText((char *)infotext,1,12);
  339.     
  340.     
  341.     
  342.         VASetColors(SelColors);
  343.         VAStep();
  344.  
  345. #define    ADVERTISE
  346. #ifdef    ADVERTISE            
  347.         {    unsigned
  348.  
  349.             char    *funtext=(void *)"\p ARASHI *** Copyright 1991-1994 Project STORM Team, All Rights Reserved *** Version 1.1.1 *** Please select your starting level ***";
  350.             int        rotme=(VA.FrameCounter) % *funtext;
  351.             
  352.             VA.segmscale= VA.segmscale/3;
  353.             if(VA.segmscale<=1) VA.segmscale=2;
  354.             VA.color=BG2;
  355.             VAMoveTo(12,VA.frame.top + VA.segmscale*7 + BoxSize.h/2); 
  356.             
  357.             /*VAMoveTo(12,VA.frame.bottom-BoxSize.v*5/3 - 100); */ /* moved up for lvBonus(mz) */
  358.             VADrawText((char *)funtext,1+rotme,*funtext-rotme);
  359.             VADrawText((char *)funtext,1,rotme);
  360.         }
  361. #endif
  362.     }    while(!done);
  363.     
  364.     VAEraseBuffer();
  365.     VACatchUp();
  366.  
  367.     HUnlock(SelColors);    
  368.     DisposHandle(SelColors);
  369.  
  370.     VA.FrameSpeed = OldFrameSpeed;    
  371.     
  372.     if(levelnum == 0)            /* saved game was loaded as level select */
  373.         Hero.Flags |= SavedGameStartMask;
  374.     else
  375.         Hero.Flags &= ~SavedGameStartMask;
  376.  
  377.     DisposPtr(stable);
  378.     
  379.     return done;
  380. }
  381.